package com.vf.admin.utils;

import com.vf.admin.common.Constants;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class HtmlStrUtils {

    /**
     * 自定义名称
     */
    public String createName() {
        SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
        return df.format(new Date()) + "_" + new Random().nextInt(1000);
    }

    /**
     * 删除老html中新html已经不用的图片,本方法用于处理的html中的图片都是在本地的图片
     */
    public void delOldByNewHtmlLoca(String oldHtml, String newHtml,String picBasePsth) {
        if(oldHtml==null){
            oldHtml = "";
        }
        if(newHtml==null){
            newHtml = "";
        }
        List<String> oldImgList = getImgStr(oldHtml);
        List<String> newImgList = getImgStr(newHtml);
        Map<String, String> newMap = new HashMap<String, String>();

        for (String newimg : newImgList) {
            newMap.put(newimg, newimg);
        }
        for (String oldimg : oldImgList) {
            Object oldimgobj = newMap.get(oldimg);
            if (oldimgobj == null) {
                delPic(picBasePsth+oldimg);
            }
        }
    }

    /**
     * 提取html中的图片、下载、保存本地
     */
    public String uploadPicSaveLocal(String htmlStr, final String imgPath) {
        List<String> imgList = getImgStr(htmlStr);
        if (imgList != null && imgList.size() >= 1) {
            for (final String oldPicUrl : imgList) {
                if (oldPicUrl.indexOf("http") == -1) {// 不包含http字符串
                    continue;
                }
                // 替换html中的图片路径
                String pictestname = oldPicUrl.substring(oldPicUrl
                        .lastIndexOf("/") + 1, oldPicUrl.length());
                String picHouzui = "jpg";
                if (pictestname.contains(".")) {
                    picHouzui = oldPicUrl.substring(
                            oldPicUrl.lastIndexOf(".") + 1, oldPicUrl.length());
                }

                final String picName = createName() + "." + picHouzui;
                String newPicUrl = imgPath + picName;
                htmlStr = htmlStr.replaceAll(oldPicUrl, newPicUrl);

                try {
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            try {
                                uploadPic(oldPicUrl, picName, imgPath);
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                        }
                    }).start();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        return htmlStr;
    }

    /**
     * 提取html中的图片，删除
     */
    public void delPicSaveLocal(String htmlStr) {
        List<String> imgList = getImgStr(htmlStr);
        if (imgList != null && imgList.size() >= 1) {
            for (final String imgsrc : imgList) {
                try {
                    delPic(imgsrc);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 删除老html中新html已经不用的图片,新照片本地不存在则下载到本地保存
     */
    public String delOldByNewHtml(String oldHtml, String newHtml,String weburl, String imgPath) {
        List<String> oldImgList = getImgStr(oldHtml);
        List<String> newImgList = getImgStr(newHtml);
        Map<String, String> newMap = new HashMap<String, String>();

        for (String newimg : newImgList) {
            newMap.put(newimg, newimg);
        }
        for (String oldimg : oldImgList) {
            Object oldimgobj = newMap.get(oldimg);
            if (oldimgobj == null) {
                delPic(oldimg);
            }
        }

        return uploadPicSaveLocal(newHtml, imgPath);
    }

    /**
     * 得到网页中图片的地址
     */
    public List<String> getImgStr(String htmlStr) {
        String img = "";
        Pattern p_image;
        Matcher m_image;
        List<String> pics = new ArrayList<String>();

        // String regEx_img = "<img.*src=(.*?)[^>]*?>"; //图片链接地址

        String regEx_img = "<img.*src\\s*=\\s*(.*?)[^>]*?>";
        p_image = Pattern.compile(regEx_img, Pattern.CASE_INSENSITIVE);
        m_image = p_image.matcher(htmlStr);
        while (m_image.find()) {
            img = img + "," + m_image.group();
            Matcher m = Pattern.compile("src\\s*=\\s*\"?(.*?)(\"|>|\\s+)")
                    .matcher(img);
            while (m.find()) {
                pics.add(m.group(1));
            }
        }
        pics = removeDuplicate(pics);
        return pics;
    }

    public List<String> removeDuplicate(List<String> list) {
        HashSet<String> hashSet = new HashSet<String>(list);
        list.clear();
        list.addAll(hashSet);
        return list;
    }

    /**
     * 网络下载图片
     *
     * @throws Exception
     */
    public static void uploadPic(String picUrl, String picName, String imgPath)
            throws Exception {
        // new一个URL对象
        URL url = new URL(picUrl);
        // 打开链接
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        // 设置请求方式为"GET"
        conn.setRequestMethod("GET");
        // 超时响应时间为5秒
        conn.setConnectTimeout(5 * 1000);
        // 通过输入流获取图片数据
        InputStream inStream = conn.getInputStream();
        // 得到图片的二进制数据，以二进制封装得到数据，具有通用性
        byte[] data = readInputStream(inStream);
        // new一个文件对象用来保存图片，默认保存当前工程根目录
        File imageFile = new File(Constants.PATH_OS_BASE + imgPath + picName);
        if (!imageFile.exists()) {
            imageFile.createNewFile();
        }
        // 创建输出流
        FileOutputStream outStream = new FileOutputStream(imageFile);
        // 写入数据
        outStream.write(data);
        // 关闭输出流
        outStream.close();
    }

    public static byte[] readInputStream(InputStream inStream) throws Exception {
        ByteArrayOutputStream outStream = new ByteArrayOutputStream();
        // 创建一个Buffer字符串
        byte[] buffer = new byte[1024];
        // 每次读取的字符串长度，如果为-1，代表全部读取完毕
        int len = 0;
        // 使用一个输入流从buffer里把数据读取出来
        while ((len = inStream.read(buffer)) != -1) {
            // 用输出流往buffer里写入数据，中间参数代表从哪个位置开始读，len代表读取的长度
            outStream.write(buffer, 0, len);
        }
        // 关闭输入流
        inStream.close();
        // 把outStream里的数据写入内存
        return outStream.toByteArray();
    }

    /**
     * 删除图片
     */
    public static void delPic(String imgPath) {
        String picName = Constants.PATH_OS_BASE + imgPath;
        File file = new File(picName);
        if (file.exists()) {
            file.delete();
        }
    }
}
